#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
设备服务器启动脚本
用于启动设备服务器实例
"""

import sys
import os
import argparse
import ipaddress
from pathlib import Path

# 添加项目根目录到Python路径
sys.path.insert(0, str(Path(__file__).parent.parent))

if __name__ == '__main__':
    # 解析命令行参数
    parser = argparse.ArgumentParser(description='启动设备服务器')
    parser.add_argument('--host', type=str, required=True, help='设备资源服务器主机地址')
    parser.add_argument('--port', type=int, required=True, help='设备资源服务器端口号')
    parser.add_argument('--hdc-path', type=str, help='HDC文件绝对路径')
    parser.add_argument('--work-path', type=str, default='~/smartest', help='工作目录路径')
    parser.add_argument('--config-file', type=str, default='config.json', help='配置文件名')
    parser.add_argument('--daemon', action='store_true', help='以守护进程模式运行')
    parser.add_argument('--pid-file', type=str, default='device-server.pid', help='守护进程模式下的PID文件路径')
    args = parser.parse_args()
    
    # 检查host参数是否为有效的IP地址
    ipaddress.ip_address(args.host)

    # 检查port参数是否为合法的端口号 (1-65535)
    if not (1 <= args.port <= 65535):
        print(f"错误: 端口号 {args.port} 超出有效范围 (1-65535)")
        sys.exit(1)

    # 检查hdc-path是否为绝对路径且文件存在
    if args.hdc_path:
        if not os.path.isabs(args.hdc_path):
            print(f"错误: HDC路径 '{args.hdc_path}' 不是绝对路径")
            sys.exit(1)
        if not os.path.isfile(args.hdc_path):
            print(f"错误: HDC文件 '{args.hdc_path}' 不存在")
            sys.exit(1)
    
    # 处理工作目录路径
    if not os.path.isabs(args.work_path):
        args.work_path = os.path.expanduser(args.work_path)
    
    # 确保工作目录存在
    os.makedirs(args.work_path, exist_ok=True)
    
    # 切换到工作目录
    os.chdir(args.work_path)

    # 如果是守护进程模式，先进行守护进程化
    if args.daemon:
        # 由于设备服务器需要与设备通过标准输入输出进行通信，退至后台时需要保留标准输入输出文件描述符
        # 当前daemonize()函数不满足要求，因此暂时关闭daemonize功能
        pass
        # from common.utils import daemonize
        # daemonize(args.pid_file)

    # 加载配置
    from common.config import load_configs
    load_configs(args.work_path, args.config_file)
    
    from dev_server.service_mgr import ServiceMgr
    service_mgr = ServiceMgr(
        host=args.host,
        port=args.port,
        hdc_path=args.hdc_path)
    service_mgr.start()
    # 阻塞主线程等待服务结束
    service_mgr.wait()